package org.xiaov.lunasql.engine.function;

import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLReplaceable;
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;

import java.util.List;

/**
 * <p>
 * ConcatMulti2ConcatFunc 将concat的多个参数转换为2个参数
 * </p>
 *
 * @author lzq
 * @since 2024/12/16 16:30
 */
public class ConcatMulti2ConcatFunc implements MySqlFunction {
    private final static String METHOD_NAME = "concat";

    @Override
    public boolean accept(SQLMethodInvokeExpr methodInvokeExpr) {
        return METHOD_NAME.equalsIgnoreCase(methodInvokeExpr.getMethodName());
    }

    @Override
    public void transform(SQLMethodInvokeExpr methodInvokeExpr) {
        List<SQLExpr> arguments = methodInvokeExpr.getArguments();
        if (arguments.size() <= 2) {
            return;
        }
        int count = arguments.size();
        SQLMethodInvokeExpr resultMethod = null;
        for (int idx = arguments.size() - 2; idx >= 0; idx--) {
            if (idx == count - 2) {
                resultMethod = new SQLMethodInvokeExpr(METHOD_NAME, null, arguments.get(idx), arguments.get(idx + 1));
            } else {
                resultMethod = new SQLMethodInvokeExpr(METHOD_NAME, null, arguments.get(idx), resultMethod);
            }
        }
        if (methodInvokeExpr.getParent() instanceof SQLReplaceable replaceable) {
            replaceable.replace(methodInvokeExpr, resultMethod);
        }
    }
}
